home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / bhc3.a < prev    next >
Text File  |  1999-06-14  |  5KB  |  273 lines

  1.  
  2.     **********************************************************
  3.     **   XFD external decruncher for the BHC3 cruncher    **
  4.     **********************************************************
  5.  
  6.         opt o+,ow2-,c-
  7.  
  8.         SECTION    BHC3,CODE
  9.  
  10.         Incdir    Inx:
  11.         Include    Libraries/xfdmaster.I
  12.         Include    Macros.I
  13.         Include    LVO.Gs
  14.         Include    Exec/Memory.I
  15.  
  16. ; xfdForeman structure MUST be first thing in all external decrunchers
  17.  
  18. F_BHC3        moveq    #-1,d0            ;security
  19.         rts
  20.  
  21.         dc.l    XFDF_ID_EQU        ;id
  22.         dc.w    2            ;version
  23.         dc.w    0
  24.         dc.l    0,0            ;private
  25.         dc.l    S_BHC3            ;first slave
  26.  
  27. **************************************************
  28.  
  29. ; xfdSlave structure: this one doesn't support segment decrunching
  30.  
  31. S_BHC3        dc.l    0            ;no more slaves
  32.         dc.w    2            ;version
  33.         dc.w    36            ;master version
  34.         dc.l    N_BHC3            ;name
  35.         dc.w    XFDPFF_RELOC        ;flags
  36.         dc.w    0
  37.         dc.l    RB_BHC3            ;recog buffer
  38.         dc.l    DB_BHC3            ;decrunch buffer
  39.         dc.l    0            ;recog segment
  40.         dc.l    0            ;decrunch segment
  41.         dc.w    0,0
  42.         dc.l    $17A            ; Minsize
  43.  
  44. N_BHC3        dc.b    'BHC3 Decruncher',0
  45.         even
  46.  
  47. ;-------------------------------------------------
  48.  
  49. ; Recog buffer function: receives buffer + length in a0/d0
  50.  
  51. RB_BHC3        Moveq.l    #1,d0            ; True
  52.  
  53.         Cmp.l    #$000003F3,(a0)
  54.         bne.b    .No
  55.  
  56.         Cmp.l    #$41FA0178,$20(a0)    ; Lea PackedData(PC),a0
  57.         Bne.b    .No
  58.  
  59.         Cmp.l    #"BHC3",$6C(a0)
  60.         Bne.b    .No
  61.  
  62.         Cmp.l    #"BHC3",$19A(a0)
  63.         Beq.b    .Yes
  64.  
  65. .No        Moveq.l    #0,d0
  66. .Yes        rts
  67.  
  68. ;-------------------------------------------------
  69.  
  70. ;Decrunch buffer function: receives bufferinfo in a0
  71.  
  72. DB_BHC3        ;Illegal
  73.         PushM    d2-d7/a2-a6
  74.         move.l    a0,a5
  75.  
  76.         Move.l    xfdbi_SourceBuffer(a5),a0
  77.         Move.l    $19e(a0),d0
  78.         Move.l    d0,xfdbi_TargetBufSaveLen(a5)
  79.         Push    d0
  80.         Add.l    #512,d0
  81.         move.l    d0,xfdbi_TargetBufLen(a5)
  82.  
  83.         Move.l    #Memf_Clear,d1
  84.         Or.l    $30(a0),d1            ; Get memtype
  85.         move.l    4.w,a6
  86.         Call    AllocMem
  87.         Tst.l    d0
  88.         beq.b    .NoMem
  89.  
  90.         Move.l    d0,a1
  91.         Lea    512(a1),a1
  92.         move.l    a1,xfdbi_TargetBuffer(a5)
  93.  
  94.         Move.l    xfdbi_SourceBuffer(a5),a0    ; packed data
  95.         Lea    $19E(a0),a0            ; Point to just after HDR
  96.         Pushm    a0/a1
  97.  
  98.         Move.l    #Memf_Clear,d1
  99.         Moveq.l    #4*4,d0
  100.         move.l    4.w,a6
  101.         Call    AllocMem
  102.         Tst.l    d0
  103.         beq.b    .NoMem2
  104.         Move.l    d0,a2
  105.         Popm    a0/a1
  106.  
  107.         Push    a2
  108.         Bsr.b    .Depack
  109.  
  110.         Pop    a1
  111.         Move.l    4.w,a6
  112.         Moveq.l    #4*4,d0
  113.         Call    FreeMem
  114.  
  115. ;Move everything back 512 bytes
  116.         move.l    xfdbi_TargetBuffer(a5),a0
  117.         move.l    a0,a1
  118.         Lea    -512(a1),a1
  119.         Move.l    a1,xfdbi_TargetBuffer(a5)
  120.         Pop    d0
  121.         Call    CopyMem
  122.  
  123.         Moveq.l    #1,d0                ; True = Decrunched ok
  124. .Out        PopM    d2-d7/a2-a6
  125.         Rts
  126.  
  127. .NoMem        moveq    #XFDERR_NOMEMORY,d1
  128.         Move.w    d1,xfdbi_Error(a5)
  129.         Bra.b    .Out
  130.  
  131. .NoMem2        moveq    #XFDERR_NOMEMORY,d1
  132.         Move.w    d1,xfdbi_Error(a5)
  133.         Move.l    xfdbi_TargetBuffer(a5),a1
  134.         Move.l    xfdbi_TargetBufLen(a5),d0
  135.         Call    FreeMem
  136.         Bra.b    .Out
  137.         
  138.  
  139. **************************************************
  140. .Depack        move.l    (A0)+,D1        ;depacked size
  141.         move.l    (A0)+,D0
  142.         move.l    A1,D7
  143.         add.l    D1,A1
  144.         move.b    (A0)+,D2
  145.         and.w    #7,D2
  146.         subq.w    #1,D2
  147.         moveq    #0,D3
  148.         move.b    (A0)+,D3
  149.         move.l    A0,(A2)
  150.         add.w    D3,A0
  151.         move.w    (A0)+,D3
  152.         move.l    A0,4(A2)
  153.         add.w    D3,A0
  154.         move.w    (A0)+,D3
  155.         move.l    A0,8(A2)
  156.         add.w    D3,A0
  157.         move.w    (A0)+,D3
  158.         move.l    A0,12(A2)
  159.         add.w    D3,A0
  160.         add.l    D0,A0
  161.         bsr    lbC000170
  162.         bra.s    lbC000098
  163.  
  164. lbC000090    add.l    D6,D6
  165.         bne.s    lbC000098
  166.  
  167.         bsr    lbC000170
  168. lbC000098    bcc.s    lbC0000E4
  169.  
  170.         move.l    4(A2),A3
  171.         bsr.b    lbC00012A
  172.         cmp.b    #6,D2
  173.         beq.s    lbC0000D4
  174.  
  175.         move.l    (A2),A3
  176.         subq.w    #1,D3
  177. lbC0000AC    add.l    D6,D6
  178.         bne.s    lbC0000B4
  179.  
  180.         bsr    lbC000170
  181. lbC0000B4    bcc.s    lbC0000C6
  182.  
  183.         moveq    #0,D4
  184.         move.w    D2,D0
  185.         bmi.s    lbC0000C0
  186.  
  187.         bsr.b    lbC000108
  188. lbC0000C0    move.b    (A3,D4.W),-(A1)
  189.         bra.s    lbC0000CE
  190.  
  191. lbC0000C6    moveq    #7,D0
  192.         bsr.b    lbC000108
  193.         move.b    D4,-(A1)
  194. lbC0000CE    dbra    D3,lbC0000AC
  195.  
  196.         bra.s    lbC000100
  197.  
  198. lbC0000D4    subq.w    #1,D3
  199. lbC0000D6    moveq    #7,D0
  200.         bsr.b    lbC000108
  201.         move.b    D4,-(A1)
  202.         dbra    D3,lbC0000D6
  203.  
  204.         bra.s    lbC000100
  205.  
  206. lbC0000E4    move.l    8(A2),A3
  207.         bsr.b    lbC00012A
  208.         move.w    D3,D4
  209.         move.l    12(A2),A3
  210.         bsr.b    lbC00012A
  211.         subq.w    #1,D3
  212. lbC0000F8    move.b    -1(A1,D4.W),-(A1)
  213.         dbra    D3,lbC0000F8
  214.  
  215. lbC000100    cmp.l    D7,A1
  216.         bhi.b    lbC000090
  217.         rts
  218.  
  219.  
  220. lbC000108    moveq    #0,D4
  221. lbC00010A    add.l    D6,D6
  222.         bne.s    lbC000112
  223.  
  224.         bsr.b    lbC000170
  225. lbC000112    addx.w    D4,D4
  226.         dbra    D0,lbC00010A
  227.  
  228.         rts
  229.  
  230.  
  231. lbC00012A    moveq    #0,D1
  232.         move.l    D1,D3
  233.  
  234. lbC00012E    moveq    #0,D0
  235.         move.b    (A3),D0
  236.         rol.w    D1,D3
  237.         add.w    D0,D1
  238.         subq.w    #1,D0
  239.         bmi.s    lbC000148
  240.  
  241. lbC00013A    add.l    D6,D6
  242.         bne.s    lbC000142
  243.  
  244.         bsr.b    lbC000170
  245. lbC000142    roxl.w    #1,D3
  246.         dbra    D0,lbC00013A
  247.  
  248. lbC000148    ror.w    D1,D3
  249.         cmp.w    2(A3),D3
  250.         beq.s    lbC000154
  251.  
  252.         addq.w    #4,A3
  253.         bra.s    lbC00012E
  254.  
  255. lbC000154    moveq    #0,D0
  256.         move.b    1(A3),D0
  257.         moveq    #1,D3
  258.         subq.w    #1,D0
  259.         bmi.s    Out
  260.  
  261. lbC000160    add.l    D6,D6
  262.         bne.s    lbC000168
  263.  
  264.         bsr.b    lbC000170
  265. lbC000168    addx.w    D3,D3
  266.         dbra    D0,lbC000160
  267. Out        rts
  268.  
  269. lbC000170    move.l    -(A0),D6
  270.         move.w    #$10,CCR
  271.         addx.l    D6,D6
  272.         rts
  273.